#!/bin/sh
# bd-hooks-version: 0.22.1
#
# bd (beads) pre-push hook
#
# This hook prevents pushing stale JSONL by:
# 1. Flushing any pending in-memory changes to JSONL (if bd available)
# 2. Checking for uncommitted changes (staged, unstaged, untracked, deleted)
# 3. Failing the push with clear instructions if changes found
#
# The pre-commit hook already exports changes, but this catches:
# - Changes made between commit and push
# - Pending debounced flushes (5s daemon delay)
#
# Installation:
#   cp examples/git-hooks/pre-push .git/hooks/pre-push
#   chmod +x .git/hooks/pre-push
#
# Or use the install script:
#   examples/git-hooks/install.sh

# Check if we're in a bd workspace
if [ ! -d .beads ]; then
    # Not a bd workspace, nothing to do
    exit 0
fi

# Optionally flush pending bd changes so they surface in JSONL
# This prevents the race where a debounced flush lands after the check
if command -v bd >/dev/null 2>&1; then
    bd sync --flush-only >/dev/null 2>&1 || true
fi

# Collect all tracked or existing JSONL files (supports both old and new names)
FILES=""
for f in .beads/beads.jsonl .beads/issues.jsonl; do
    # Include file if it exists in working tree OR is tracked by git (even if deleted)
    if git ls-files --error-unmatch "$f" >/dev/null 2>&1 || [ -f "$f" ]; then
        FILES="$FILES $f"
    fi
done

# Check for any uncommitted changes using porcelain status
# This catches: staged, unstaged, untracked, deleted, renamed, and conflicts
if [ -n "$FILES" ]; then
    # shellcheck disable=SC2086
    if [ -n "$(git status --porcelain -- $FILES 2>/dev/null)" ]; then
        echo "❌ Error: Beads JSONL has uncommitted changes" >&2
        echo "" >&2
        echo "You made changes to bd issues between your last commit and this push." >&2
        echo "Please commit the updated JSONL before pushing:" >&2
        echo "" >&2
        # shellcheck disable=SC2086
        echo "  git add $FILES" >&2
        echo '  git commit -m "Update bd JSONL"' >&2
        echo "  git push" >&2
        echo "" >&2
        exit 1
    fi
fi

exit 0
